package ar.edu.utn.frgp.banco.dao.Implements;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.Interfaces.IntMovimientos;
import ar.edu.utn.frgp.banco.dao.connection.ImpConectionHandler;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Movimiento;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;

public class ImpMovimientos implements IntMovimientos {

	@Override
	public void AltaMovimiento(Movimiento movimiento)
			throws Exception {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Insert into Movimientos (id_cuenta, fecha, ");
			stringBuilder.append("tipomov, origen, saldo, monto) ");
			stringBuilder.append("VALUES (?,?,?,?,?,?)");
			
			ps = cn.prepareStatement(stringBuilder.toString());
		
			ps.setInt(1, movimiento.getId_cuenta());
			ps.setDate(2, new java.sql.Date(movimiento.getFecha().getTime()));
			ps.setString(3, movimiento.getTipoMov());
			ps.setString(4, movimiento.getOrigen());
			ps.setDouble(5, movimiento.getSaldoActual());
			ps.setDouble(6, movimiento.getMonto());
			ps.executeUpdate();
	
		} catch (SQLException e) {
			throw new DataAccessException(e);
		
		} catch (Exception e) {
			throw new Exception(e);
					
		} finally {
			handler.closeResources(ps, cn);
		}

	}

	@Override
	public Movimiento TraeMovimiento(Integer id_movimiento)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		Movimiento mov = null;
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_movimiento, id_cuenta, fecha, ");
			stringBuilder.append("tipomov, origen, saldo, monto ");
			stringBuilder.append("from movimientos ");
			stringBuilder.append("WHERE id_movimiento = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, id_movimiento);
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				mov = new Movimiento();
				
				mov.setId_movimiento(rs.getInt("id_movimiento"));
				mov.setId_cuenta(rs.getInt("id_cuenta"));
				mov.setFecha(rs.getDate("fecha"));
				mov.setTipoMov(rs.getString("tipomov"));
				mov.setOrigen(rs.getString("origen"));
				mov.setSaldoActual(rs.getDouble("saldo"));
				mov.setMonto(rs.getDouble("monto"));
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return mov;
	}

	@Override
	public List<Movimiento> TraeMovimientos(Cuenta cuenta)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Movimiento> movimientos = new ArrayList<Movimiento>();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_movimiento, id_cuenta, fecha, ");
			stringBuilder.append("tipomov, origen, saldo, monto ");
			stringBuilder.append("from movimientos ");
			stringBuilder.append("WHERE id_cuenta = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, cuenta.getID_Cuenta());
			
			rs = ps.executeQuery();
			Movimiento mov = null;
			while (rs.next()) {
				mov = new Movimiento();
				
				mov.setId_movimiento(rs.getInt("id_movimiento"));
				mov.setId_cuenta(rs.getInt("id_cuenta"));
				mov.setFecha(rs.getDate("fecha"));
				mov.setTipoMov(rs.getString("tipomov"));
				mov.setOrigen(rs.getString("origen"));
				mov.setSaldoActual(rs.getDouble("saldo"));
				mov.setMonto(rs.getDouble("monto"));
			
				movimientos.add(mov);
			}
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return movimientos;
	}

	@Override
	public List<Movimiento> TraeMovimientos(Cliente cliente)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Cuenta> cuentas = null;
		List<Movimiento> movimientos = new ArrayList<Movimiento>();
		cuentas = cliente.getCuentas();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			for (Cuenta cuenta : cuentas){
				
				StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.append("Select id_movimiento, id_cuenta, fecha, ");
				stringBuilder.append("tipomov, origen, saldo, monto ");
				stringBuilder.append("from movimientos ");
				stringBuilder.append("WHERE id_cuenta = ?");

				ps = cn.prepareStatement(stringBuilder.toString());
				ps.setInt(1, cuenta.getID_Cuenta());
				
				rs = ps.executeQuery();
				Movimiento mov = null;
				while (rs.next()) {
					mov = new Movimiento();
					
					mov.setId_movimiento(rs.getInt("id_movimiento"));
					mov.setId_cuenta(rs.getInt("id_cuenta"));
					mov.setFecha(rs.getDate("fecha"));
					mov.setTipoMov(rs.getString("tipomov"));
					mov.setOrigen(rs.getString("origen"));
					mov.setSaldoActual(rs.getDouble("saldo"));
					mov.setMonto(rs.getDouble("monto"));
				
					movimientos.add(mov);
				}
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return movimientos;
	}

}
